package ch04
{
	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.text.TextField;

	/**
	 * 创建多条曲线,创建平滑曲线
	 * @author jianping.shenjp
	 *
	 */
	public class MultiCurves2 extends Sprite
	{
		private var numPoints:uint=9;

		public function MultiCurves2()
		{
			init();
		}

		private function init():void
		{

			// first set up an array of random points 
			var points:Array=new Array();
			for (var i:int=0; i < numPoints; i++)
			{
				points[i]=new Object();
				points[i].x=Math.random() * stage.stageHeight;
				points[i].y=Math.random() * stage.stageHeight;
			}
			/**
			 * 在每两对点之间，加入一个新点(中间点)放在这两点的正中间。然后使用这些中间点作为起点和终点，而把最初的那些点(原始点)作为控制点。
			 *
			 * for 循环从1开始到 points.length -2 结束，也就避开了第一个点和最后一个点。
			 * 程序要做的是，创建新的 x,y 点，这个点是数组中后面两个点位的平均值。
			 * 然后从数组下一个点位开始画一条曲线到新的平均点(中间点)。
			 * 当循环结束时， i 变量指向倒数第二个元素，因此，可以穿过这里向最后一个点画条曲线。
			 * */
			graphics.lineStyle(1);
			// now move to the first point 
			drawCircle(points[0], 0, 0xFFF000);
			graphics.moveTo(points[0].x, points[0].y);
			// and loop through each next successive pair 
			for (i=1; i < numPoints - 2; i++)
			{
				var dx:Number=(points[i + 1].x + points[i].x) / 2;
				var dy:Number=(points[i + 1].y + points[i].y) / 2;
				drawCircle(points[i], i, 0xFFF000);
				drawCircle({x: dx, y: dy}, i + 0.5, 0xFF0000);
				graphics.curveTo(points[i].x, points[i].y, dx, dy);
			}
			trace(i+".............");
			drawCircle(points[i], i, 0xFFF000);
			drawCircle(points[i + 1], i + 1, 0xFFF000);
			graphics.curveTo(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y);
		}

		private function drawCircle(obj:Object, num:Number, color:uint):void
		{
			var sp:Sprite=new Sprite();
			var g:Graphics=sp.graphics;
			g.beginFill(color);
			g.drawCircle(0, 0, 3);
			sp.x=obj.x;
			sp.y=obj.y;
			g.endFill();
			this.addChild(sp);
			var txt:TextField=new TextField();
			txt.text=num + "";
			txt.x=sp.x + 3;
			txt.y=sp.y;
			this.addChild(txt);
		}
	}
}